package proccrontrol

import (
	"communication-system/common/messages"
	"communication-system/common/utils"
	"encoding/json"
	"fmt"
	"net"
	"os"
)

//显示登陆成功后的界面
func show_menu() {
	fmt.Println("---------恭喜用户XX登陆成功----------")
	fmt.Println("1.显示在线用户列表")
	fmt.Println("2.发送消息")
	fmt.Println("3.信息列表")
	fmt.Println("4.退出系统")
	fmt.Println("请选择(1-4)")
	var key int
	fmt.Scanln(&key)
	var conent string
	switch key {
	case 1:
		fmt.Println("显示在线用户列表")
		outPutOnlineUsers()
	case 2:
		fmt.Println("发送消息")
		fmt.Println("请输入要发群发的消息>>>:")
		fmt.Scanln(&conent)
		var smsprocess SmsProcess
		smsprocess.SendGroupMes(conent)
		
	case 3:
		fmt.Println("信息列表")
	case 4:
		fmt.Println("退出系统")
		os.Exit(0)
	default:
		fmt.Println("输入选项不合法")

	}

}

//该函数被用于client请求时另外启动协程启动，和服务器一直保持通讯，一旦服务器有消息发送给客户端，立即打印在客户端
func serverProcessMes(conn net.Conn) {
	//创建一个transfer实例，不停的等待读取服务器返回消息
	transfer := &utils.TransFer{
		Conn: conn,
	}
	for {

		fmt.Println("客户端一直在等待服务器端发送消息....")
		mes, err := transfer.Readpkg()
		if err != nil {
			fmt.Println("客户端与服务器端通讯异常....,err=", err)
			return
		}
		//如果读到服务器端发来的消息，做后续处理
		fmt.Println("从服务器端读到的消息:", mes)
		switch mes.Type {
		case messages.NotifyUserStatusMesType: //有人上线了
			//取出NotifyUserStatusMes
			var notifyUserStatusMes messages.NotifyUserStatusMes
			json.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)
			fmt.Println("序列化结果取出notifyUserStatusMes:",notifyUserStatusMes)
			//把这个用户的信息保存到onlineUsers中,第一次上线就直接保存，不是第一次上线就根据实际的状态更新到map中
			updateUserStatus(&notifyUserStatusMes)
		case messages.SmsMesType:
			outputGroupMes(&mes)

		default:
			fmt.Println("服务器端返回的消息类型未知....")

		}

	}
}
